#!/bin/bash

# 颜色定义
GREEN="\033[0;32m"
BLUE="\033[0;34m"
YELLOW="\033[0;33m"
RED="\033[0;31m"
NC="\033[0m" # No Color

# 打印带颜色的信息
info() {
  echo -e "${BLUE}[INFO]${NC} $1"
}

success() {
  echo -e "${GREEN}[SUCCESS]${NC} $1"
}

warning() {
  echo -e "${YELLOW}[WARNING]${NC} $1"
}

error() {
  echo -e "${RED}[ERROR]${NC} $1"
  exit 1
}

# 检查命令是否存在
check_command() {
  if ! command -v $1 &>/dev/null; then
    error "$1 命令未找到，请先安装"
  fi
}

# 检查必要的命令
check_command "node"
check_command "npm"
check_command "pnpm"

# 默认配置
DEFAULT_PROJECT_NAME="hzy-demo"
DEFAULT_PROJECT_PATH="$(pwd)"

# 获取用户输入
read -p "请输入项目名称 (默认: $DEFAULT_PROJECT_NAME): " PROJECT_NAME
PROJECT_NAME=${PROJECT_NAME:-$DEFAULT_PROJECT_NAME}

read -p "请输入项目路径 (默认: $DEFAULT_PROJECT_PATH): " PROJECT_PATH
PROJECT_PATH=${PROJECT_PATH:-$DEFAULT_PROJECT_PATH}

# 完整项目路径
FULL_PROJECT_PATH="$PROJECT_PATH/$PROJECT_NAME"

# 当前脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 创建项目
info "开始创建项目: $PROJECT_NAME 在 $PROJECT_PATH"

# 检查项目目录是否已存在
if [ -d "$FULL_PROJECT_PATH" ]; then
  warning "目录 $FULL_PROJECT_PATH 已存在"
  read -p "是否继续? (y/n): " CONTINUE
  if [ "$CONTINUE" != "y" ]; then
    error "用户取消操作"
  fi
fi

# 创建项目目录
mkdir -p "$FULL_PROJECT_PATH"
cd "$FULL_PROJECT_PATH" || error "无法进入项目目录"

# 使用官方脚手架创建项目
info "使用官方脚手架创建 pnpm + vite + vue3 + ts 项目"
npm create vite@latest . -- --template vue-ts || error "创建项目失败"

# 初始化 pnpm
info "初始化 pnpm"
pnpm install || error "pnpm 安装依赖失败"

# 安装 uni-app 相关插件
info "安装 uni-app 相关插件"
pnpm add -D @dcloudio/vite-plugin-uni @uni-helper/vite-plugin-uni-pages @uni-helper/vite-plugin-uni-platform @uni-helper/vite-plugin-uni-layouts @uni-helper/vite-plugin-uni-manifest || error "安装 uni-app 插件失败"

# 安装自动化插件
info "安装自动化插件"
pnpm add -D unplugin-auto-import vite-plugin-restart || error "安装自动化插件失败"

# 安装前端六件套
info "安装前端六件套"
pnpm add -D prettier eslint eslint-plugin-vue @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-prettier eslint-plugin-prettier stylelint stylelint-config-standard stylelint-config-prettier stylelint-order stylelint-scss postcss-html || error "安装前端六件套失败"

# 安装其他插件
info "安装其他插件"
pnpm add -D unocss pinia pinia-plugin-persistedstate || error "安装其他插件失败"

# 安装 eslint 相关插件
info "安装 eslint 相关插件"
pnpm add -D eslint-plugin-import eslint-config-standard || error "安装 eslint 相关插件失败"

# 创建项目结构
info "创建项目结构"

# 创建环境配置文件
mkdir -p env
touch env/.env env/.env.development env/.env.production env/.env.test

# 创建 src 目录结构
mkdir -p src/api src/components src/hooks src/interceptors src/layouts src/pages src/static src/stores src/style src/types src/utils

# 创建 vite-plugins 目录
mkdir -p vite-plugins

# 创建 .vscode 目录
mkdir -p .vscode

# 复制前端六件套配置文件
info "复制前端六件套配置文件"
cp "$SCRIPT_DIR/前端六件套/.editorconfig" "$FULL_PROJECT_PATH/" || warning "复制 .editorconfig 失败"
cp "$SCRIPT_DIR/前端六件套/.eslintignore" "$FULL_PROJECT_PATH/" || warning "复制 .eslintignore 失败"
cp "$SCRIPT_DIR/前端六件套/.eslintrc-auto-import.json" "$FULL_PROJECT_PATH/" || warning "复制 .eslintrc-auto-import.json 失败"
cp "$SCRIPT_DIR/前端六件套/.eslintrc.cjs" "$FULL_PROJECT_PATH/" || warning "复制 .eslintrc.cjs 失败"
cp "$SCRIPT_DIR/前端六件套/.prettierignore" "$FULL_PROJECT_PATH/" || warning "复制 .prettierignore 失败"
cp "$SCRIPT_DIR/前端六件套/.prettierrc.cjs" "$FULL_PROJECT_PATH/" || warning "复制 .prettierrc.cjs 失败"
cp "$SCRIPT_DIR/前端六件套/.stylelintignore" "$FULL_PROJECT_PATH/" || warning "复制 .stylelintignore 失败"
cp "$SCRIPT_DIR/前端六件套/.stylelintrc.cjs" "$FULL_PROJECT_PATH/" || warning "复制 .stylelintrc.cjs 失败"

# 复制 .vscode 配置文件
info "复制 .vscode 配置文件"
cp "$SCRIPT_DIR/.vscode/extensions.json" "$FULL_PROJECT_PATH/.vscode/" || warning "复制 extensions.json 失败"
cp "$SCRIPT_DIR/.vscode/settings.json" "$FULL_PROJECT_PATH/.vscode/" || warning "复制 settings.json 失败"
cp "$SCRIPT_DIR/.vscode/vue3.code-snippets" "$FULL_PROJECT_PATH/.vscode/" || warning "复制 vue3.code-snippets 失败"

# 创建配置文件
info "创建配置文件"

# 创建 manifest.config.ts
cat >manifest.config.ts <<'EOF'
import { defineConfig } from '@uni-helper/vite-plugin-uni-manifest'

export default defineConfig({
  name: '${PROJECT_NAME}',
  appid: '',
  description: '',
  versionName: '1.0.0',
  versionCode: '100',
  transformPx: false,
  /* 5+App特有相关 */
  app: {},
  /* 微信小程序特有相关 */
  mp: {},
  /* 开发环境 */
  debug: true,
})
EOF

# 创建 pages.config.ts
cat >pages.config.ts <<'EOF'
import { defineConfig } from '@uni-helper/vite-plugin-uni-pages'

export default defineConfig({
  pages: [],
  globalStyle: {
    navigationBarTextStyle: 'black',
    navigationBarTitleText: '${PROJECT_NAME}',
    navigationBarBackgroundColor: '#F8F8F8',
    backgroundColor: '#F8F8F8',
  },
})
EOF

# 创建 uno.config.ts
cat >uno.config.ts <<'EOF'
import { defineConfig, presetAttributify, presetIcons, presetUno } from 'unocss'

export default defineConfig({
  presets: [presetUno(), presetAttributify(), presetIcons()],
})
EOF

# 创建 vite.config.ts
cat >vite.config.ts <<'EOF'
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import AutoImport from 'unplugin-auto-import/vite'
import UniPages from '@uni-helper/vite-plugin-uni-pages'
import UniLayouts from '@uni-helper/vite-plugin-uni-layouts'
import UniPlatform from '@uni-helper/vite-plugin-uni-platform'
import UniManifest from '@uni-helper/vite-plugin-uni-manifest'
import Restart from 'vite-plugin-restart'
import Unocss from 'unocss/vite'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    // uni-app 插件
    uni(),
    
    // 自动生成路由
    UniPages(),
    
    // 布局系统
    UniLayouts(),
    
    // 平台差异化配置
    UniPlatform(),
    
    // 自动生成 manifest.json
    UniManifest(),
    
    // 自动导入 API
    AutoImport({
      imports: ['vue', 'uni-app', 'pinia'],
      dts: 'src/auto-imports.d.ts',
      eslintrc: {
        enabled: true,
      },
    }),
    
    // 热重启
    Restart({
      restart: ['vite.config.ts'],
    }),
    
    // UnoCSS
    Unocss(),
  ],
})
EOF

# 创建 src/env.d.ts
cat >src/env.d.ts <<'EOF'
/// <reference types="@dcloudio/types" />
/// <reference types="vite/client" />

declare module '*.vue' {
  import { DefineComponent } from 'vue'
  const component: DefineComponent<{}, {}, any>
  export default component
}
EOF

# 创建 src/typings.d.ts
cat >src/typings.d.ts <<'EOF'
declare namespace UniApp {
  interface Uni {
    // 扩展 uni 接口
  }
}
EOF

# 创建 src/uni.scss
touch src/uni.scss

# 创建 src/App.vue
cat >src/App.vue <<'EOF'
<script setup lang="ts">
// App.vue
</script>

<style>
/* 全局样式 */
</style>
EOF

# 创建 src/main.ts
cat >src/main.ts <<'EOF'
import { createSSRApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import 'uno.css'

export function createApp() {
  const app = createSSRApp(App)
  
  // 创建 pinia 实例
  const pinia = createPinia()
  pinia.use(piniaPluginPersistedstate)
  app.use(pinia)
  
  return {
    app,
  }
}
EOF

# 创建 src/pages/index/index.vue
mkdir -p src/pages/index
cat >src/pages/index/index.vue <<'EOF'
<template>
  <view class="content">
    <image class="logo" src="/static/logo.png" />
    <view class="text-area">
      <text class="title">{{ title }}</text>
    </view>
  </view>
</template>

<script setup lang="ts">
const title = ref('Hello')
</script>

<style>
.content {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.logo {
  height: 200rpx;
  width: 200rpx;
  margin-top: 200rpx;
  margin-bottom: 50rpx;
}

.text-area {
  display: flex;
  justify-content: center;
}

.title {
  font-size: 36rpx;
  color: #8f8f94;
}
</style>
EOF

# 创建 src/static/logo.png (使用空文件代替)
mkdir -p src/static
touch src/static/logo.png

# 创建 src/manifest.json
cat >src/manifest.json <<'EOF'
{
  "name": "${PROJECT_NAME}",
  "appid": "",
  "description": "",
  "versionName": "1.0.0",
  "versionCode": "100"
}
EOF

# 创建 README.md
cat >README.md <<'EOF'
# ${PROJECT_NAME}

基于 uni-app + Vue 3 + TypeScript + Vite 的项目

## 特性

- 🚀 [Vue 3](https://v3.cn.vuejs.org/)，[Vite](https://cn.vitejs.dev/)，[pnpm](https://pnpm.js.org/)，[ESBuild](https://esbuild.github.io/) - 快速的开发体验
- 📦 [组件自动化加载](./src/components)
- 📑 [布局系统](./src/layouts)
- 🎨 [UnoCSS](https://github.com/unocss/unocss) - 高性能且极具灵活性的即时原子化 CSS 引擎
- 😃 [各种图标集为你所用](https://github.com/antfu/unocss/tree/main/packages/preset-icons)
- 🔥 使用 [新的 `<script setup>` 语法](https://github.com/vuejs/rfcs/pull/227)
- 📥 [API 自动加载](https://github.com/antfu/unplugin-auto-import) - 直接使用 Composition API 无需引入
- 🦾 [TypeScript](https://www.typescriptlang.org/) - 强类型支持
- 🔒 使用 [husky](https://typicode.github.io/husky/#/) 和 [lint-staged](https://github.com/okonet/lint-staged) 提升代码质量

## 预配置

### UI 框架

- [UnoCSS](https://github.com/unocss/unocss) - 高性能且极具灵活性的即时原子化 CSS 引擎

### 插件

- [Vue](https://vuejs.org/) - 渐进式 JavaScript 框架
  - [Vue Router](https://router.vuejs.org/) - Vue.js 的官方路由
  - [Pinia](https://pinia.esm.dev/) - 值得你喜欢的 Vue Store
  - [pinia-plugin-persistedstate](https://github.com/prazdevs/pinia-plugin-persistedstate) - Pinia 状态持久化插件
- [UnoCSS](https://github.com/unocss/unocss) - 高性能且极具灵活性的即时原子化 CSS 引擎
- [unplugin-auto-import](https://github.com/antfu/unplugin-auto-import) - API 自动导入
- [vite-plugin-restart](https://github.com/antfu/vite-plugin-restart) - 修改 Vite 配置文件后自动重启 Vite 服务器

### 编码风格

- [ESLint](https://eslint.org/) - 代码质量和规范检查
- [Prettier](https://prettier.io/) - 代码格式化
- [Stylelint](https://stylelint.io/) - CSS 代码规范检查

### 开发工具

- [TypeScript](https://www.typescriptlang.org/)
- [VS Code 扩展](./.vscode/extensions.json)
  - [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) - Vue 3 IDE 支持
  - [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) - 代码质量和规范检查
  - [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) - 代码格式化
  - [Stylelint](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint) - CSS 代码规范检查

## 使用

### 开发

```bash
pnpm dev
```

### 构建

```bash
pnpm build
```
EOF

# 验证项目是否正常运行
info "验证项目是否正常运行"

# 尝试运行项目
info "尝试运行项目 (按 Ctrl+C 退出)"
pnpm dev

success "项目创建完成: $FULL_PROJECT_PATH"
